home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / util / misc / frodo.lha / src / 6526.asm < prev    next >
Assembly Source File  |  1995-01-25  |  23KB  |  1,228 lines

  1. *
  2. * 6526.asm - CIA-Emulation
  3. *
  4. * Copyright (C) 1994-1995 by Christian Bauer
  5. *
  6.  
  7. *
  8. * Anmerkungen:
  9. * ------------
  10. *
  11. * Funktionsweise/Periodic:
  12. *  - Für jede (simulierte) C64-Rasterzeile wird vom 6510-Task die Routine
  13. *    Periodic6526 aufgerufen, die die Timer herunterzählt, ggf. Interrupts
  14. *    auslöst und die Joysticks abfragt
  15. *
  16. * Timer/Latches:
  17. *  - Die Bytefolge im Register-File ist gegenüber dem echten 6526 umgekehrt,
  18. *    das wird aber bei den WriteTo6526- und ReadFrom6526-Routinen wieder
  19. *    ausgeglichen
  20. *
  21. * TOD-Clocks:
  22. *  - Die TODs werden synchron mit dem VBlank gezählt. Es wird also ein
  23. *    50Hz-Eingangssignal simuliert.
  24. *
  25. * Tastaturabfrage:
  26. *  - Das Feld KeyMatrix enthält für jede Taste entsprechend der C64-
  27. *    Tastaturmatrix ein Bit (0: Taste gedrückt, 1: Taste nicht gedrückt)
  28. *  - Bei Lesezugriffen aus CIA-A, Port B werden entsprechend der aktiven
  29. *    (ausgewählten) Zeilen der Tastatur die entsprechenden Bits aus der
  30. *    Tastaturmatrix zusammengestellt
  31. *  - Die Help-Taste löst einen NMI aus (Restore), F10 einen RESET,
  32. *    über F9 wird das Einstellungs-Fenster aufgerufen
  33. *
  34. * Inkompatibilitäten:
  35. *  - Die TOD-Clock sollte bei einem Lesezugriff nicht angehalten,
  36. *    sondern gelatcht werden
  37. *
  38.  
  39.         MACHINE    68020
  40.  
  41.         XREF    ShowPrefs    ;Main.asm
  42.  
  43.         XREF    _ciaaprb
  44.         XREF    _ciaaddrb
  45.  
  46.         XREF    IntIsRESET    ;6510.asm
  47.         XREF    IntIsNMI
  48.         XREF    IntIsCIAIRQ
  49.         XREF    Peri6526Cont
  50.  
  51.         XREF    ChangedVA    ;6569.asm
  52.  
  53.         XREF    Reset6581    ;6581.asm
  54.  
  55.         XREF    IECIsOpen    ;1541.asm
  56.  
  57.         XDEF    Reset6526
  58.         XDEF    ReadFrom6526A
  59.         XDEF    ReadFrom6526B
  60.         XDEF    WriteTo6526A
  61.         XDEF    WriteTo6526B
  62.         XDEF    Periodic6526
  63.         XDEF    ChangedKeys
  64.         XDEF    CountTODs
  65.         XDEF    KeyPressed
  66.  
  67.         XDEF    CIACycles    ;Prefs
  68.         XDEF    Joystick1On
  69.         XDEF    Joystick2On
  70.         XDEF    JoystickSwap
  71.         XDEF    KeyboardYZ
  72.  
  73.         SECTION    "CODE",CODE
  74.  
  75. **
  76. ** Definitionen
  77. **
  78.  
  79. ; CIA-Register
  80. PRA        = 0
  81. PRB        = 1
  82. DDRA        = 2
  83. DDRB        = 3
  84. TAHI        = 4    ;Timer-Wert A
  85. TALO        = 5    ;Achtung: Umgekehrte Bytefolge!
  86. TBHI        = 6    ;Timer-Wert B
  87. TBLO        = 7
  88. TOD10THS    = 8
  89. TODSEC        = 9
  90. TODMIN        = 10
  91. TODHR        = 11
  92. SDR        = 12
  93. ICR        = 13    ;Interrupt-Data
  94. CRA        = 14
  95. CRB        = 15
  96.  
  97. ; Zusätzliche Register
  98. LTCHA        = 16    ;Timer-Latch A
  99. LTCHB        = 18    ;Timer-Latch B
  100. INTMASK        = 20    ;Interrupt-Enable
  101. TODHALT        = 21    ;TOD zwecks Beschreiben/Auslesen gestoppt
  102. ALM10THS    = 22    ;Alarmzeit
  103. ALMSEC        = 23
  104. ALMMIN        = 24
  105. ALMHR        = 25
  106. TODDIV        = 26    ;TOD-Frequenzteiler
  107. TACNTPHI2    = 27    ;Timer A läuft und zählt Phi2
  108. TBCNTPHI2    = 28    ;Timer B läuft und zählt Phi2
  109. TBCNTTA        = 29    ;Timer B läuft und zählt Unterläufe von Timer A
  110. JOY1        = 30    ;Joystick 1 AND-Wert (nur CIA-A)
  111. JOY2        = 31    ;Joystick 2 AND-Wert (nur CIA-A)
  112.  
  113.  
  114. **
  115. ** CIAs zurücksetzen
  116. **
  117.  
  118. ; CIA-A
  119. Reset6526    lea    Registers1,a0
  120.         clr.l    (a0)
  121.         clr.l    4(a0)
  122.         clr.l    8(a0)
  123.         clr.l    12(a0)
  124.         move.w    #-1,TAHI(a0)        ;Timer auf -1
  125.         move.w    #-1,TBHI(a0)
  126.  
  127.         move.w    #$0001,LTCHA(a0)    ;Latches auf 1
  128.         move.w    #$0001,LTCHB(a0)
  129.         clr.b    INTMASK(a0)        ;Interrupts abschalten
  130.         clr.b    TODHALT(a0)        ;TOD läuft
  131.         clr.l    ALM10THS(a0)        ;Alarmzeit auf 00:00:00.0
  132.         clr.w    TACNTPHI2(a0)        ;Beide Timer anhalten
  133.         move.b    #$ff,JOY1(a0)        ;Joystick inaktiv
  134.         move.b    #$ff,JOY2(a0)
  135.  
  136. ; CIA-B
  137.         lea    Registers2,a0
  138.         clr.l    (a0)
  139.         clr.l    4(a0)
  140.         clr.l    8(a0)
  141.         clr.l    12(a0)
  142.         move.w    #-1,TAHI(a0)        ;Timer auf -1
  143.         move.w    #-1,TBHI(a0)
  144.  
  145.         move.w    #$0001,LTCHA(a0)    ;Latches auf 1
  146.         move.w    #$0001,LTCHB(a0)
  147.         clr.b    INTMASK(a0)        ;Interrupts abschalten
  148.         clr.b    TODHALT(a0)        ;TOD läuft
  149.         clr.l    ALM10THS(a0)        ;Alarmzeit auf 00:00:00.0
  150.         clr.w    TACNTPHI2(a0)        ;Beide Timer anhalten
  151.  
  152. ; Tastaturmatrix löschen
  153.         moveq    #-1,d0
  154.         move.l    d0,KeyMatrix
  155.         move.l    d0,KeyMatrix+4
  156.  
  157. ; VIC-Bank 0 einstellen
  158.         moveq    #0,d0
  159.         bra    ChangedVA
  160.  
  161.  
  162. **
  163. ** Tastaturbelegung geändert, Y und Z sortieren
  164. **
  165.  
  166. ChangedKeys    tst.w    KeyboardYZ
  167.         bne    1$
  168.         move.l    #$00010004,KeyPatch1
  169.         move.l    #$00030001,KeyPatch2
  170.         rts
  171. 1$        move.l    #$00030001,KeyPatch1
  172.         move.l    #$00010004,KeyPatch2
  173.         rts
  174.  
  175.  
  176. **
  177. ** In ein CIA-A-Register schreiben
  178. ** d0.w: Registernummer ($00-$0f)
  179. ** d1.b: Byte
  180. **
  181. ** Darf das obere Wort von d0 und d1 nicht verändern!
  182. **
  183.  
  184. WriteTo6526A    lea    Registers1,a0
  185.         move.l    WriteTabA(pc,d0.w*4),a1
  186.         jmp    (a1)
  187.  
  188.         CNOP    0,4
  189. WriteTabA    dc.l    WrNormal
  190.         dc.l    WrNormal
  191.         dc.l    WrNormal
  192.         dc.l    WrNormal
  193.         dc.l    WrTALO
  194.         dc.l    WrTAHI
  195.         dc.l    WrTBLO
  196.         dc.l    WrTBHI
  197.         dc.l    WrTOD10THS
  198.         dc.l    WrTODSEC
  199.         dc.l    WrTODMIN
  200.         dc.l    WrTODHR
  201.         dc.l    WrNormal
  202.         dc.l    WrICR
  203.         dc.l    WrCRA
  204.         dc.l    WrCRB
  205.  
  206. WrNormal    move.b    d1,(a0,d0.w)
  207.         rts
  208.  
  209. WrTALO        move.b    d1,LTCHA+1(a0)
  210.         rts
  211.  
  212. WrTAHI        move.b    d1,LTCHA(a0)
  213.         btst    #0,CRA(a0)        ;Timer A gestoppt?
  214.         bne    1$
  215.         move.w    LTCHA(a0),TAHI(a0)    ;Ja, Timer laden
  216. 1$        rts
  217.  
  218. WrTBLO        move.b    d1,LTCHB+1(a0)
  219.         rts
  220.  
  221. WrTBHI        move.b    d1,LTCHB(a0)
  222.         btst    #0,CRB(a0)        ;Timer B gestoppt?
  223.         bne    1$
  224.         move.w    LTCHB(a0),TBHI(a0)    ;Ja, Timer laden
  225. 1$        rts
  226.  
  227. WrTOD10THS    and.b    #$0f,d1
  228.         clr.b    TODHALT(a0)    ;TOD weiterlaufen lassen
  229.         btst    #7,CRB(a0)    ;Alarm-Zeit schreiben?
  230.         bne    1$
  231.         move.b    d1,TOD10THS(a0)
  232.         rts
  233. 1$        move.b    d1,ALM10THS(a0)
  234.         rts
  235.  
  236. WrTODSEC    and.b    #$7f,d1
  237.         btst    #7,CRB(a0)    ;Alarm-Zeit schreiben?
  238.         bne    1$
  239.         move.b    d1,TODSEC(a0)
  240.         rts
  241. 1$        move.b    d1,ALMSEC(a0)
  242.         rts
  243.  
  244. WrTODMIN    and.b    #$7f,d1
  245.         btst    #7,CRB(a0)    ;Alarm-Zeit schreiben?
  246.         bne    1$
  247.         move.b    d1,TODMIN(a0)
  248.         rts
  249. 1$        move.b    d1,ALMMIN(a0)
  250.         rts
  251.  
  252. WrTODHR        and.b    #$9f,d1
  253.         st.b    TODHALT(a0)    ;TOD anhalten
  254.         btst    #7,CRB(a0)    ;Alarm-Zeit schreiben?
  255.         bne    1$
  256.         move.b    d1,TODHR(a0)
  257.         rts
  258. 1$        move.b    d1,ALMHR(a0)
  259.         rts
  260.  
  261. WrICR        bclr    #7,d1            ;S/C-Bit löschen
  262.         bne    1$            ;War es gesetzt?
  263.         not.b    d1            ;Nein, Bits zum Löschen negieren
  264.         and.b    d1,INTMASK(a0)        ;Und Bits löschen
  265.         bra    2$
  266. 1$        or.b    d1,INTMASK(a0)        ;Bits setzen
  267. 2$        rts
  268.  
  269. WrCRA        btst    #4,d1            ;Force load?
  270.         beq    1$
  271.         and.b    #$ef,d1
  272.         move.w    LTCHA(a0),TAHI(a0)    ;Ja, Timer laden
  273. 1$        move.b    d1,CRA(a0)
  274.  
  275.         and.b    #$21,d1            ;Läuft der Timer und zählt er Phi2?
  276.         cmp.b    #$01,d1
  277.         seq.b    TACNTPHI2(a0)        ;Ja, Flag setzen
  278.         rts
  279.  
  280. WrCRB        btst    #4,d1            ;Force load?
  281.         beq    1$
  282.         and.b    #$ef,d1
  283.         move.w    LTCHB(a0),TBHI(a0)    ;Ja, Timer laden
  284. 1$        move.b    d1,CRB(a0)
  285.  
  286.         and.b    #$61,d1            ;Läuft der Timer und zählt er Phi2?
  287.         cmp.b    #$01,d1
  288.         seq.b    TBCNTPHI2(a0)        ;Ja, Flag setzen
  289.         cmp.b    #$41,d1            ;Läuft er und zählt Unterläuft von Timer A?
  290.         seq.b    TBCNTTA(a0)        ;Ja, Flag setzen
  291.         rts
  292.  
  293.  
  294. **
  295. ** In ein CIA-B-Register schreiben
  296. ** d0.w: Registernummer ($00-$0f)
  297. ** d1.b: Byte
  298. **
  299. ** Darf das obere Wort von d0 und d1 nicht verändern!
  300. **
  301.  
  302. WriteTo6526B    lea    Registers2,a0
  303.         move.l    WriteTabB(pc,d0.w*4),a1
  304.         jmp    (a1)
  305.  
  306.         CNOP    0,4
  307. WriteTabB    dc.l    WrBPRA
  308.         dc.l    WrNormal
  309.         dc.l    WrBDDRA
  310.         dc.l    WrNormal
  311.         dc.l    WrTALO
  312.         dc.l    WrTAHI
  313.         dc.l    WrTBLO
  314.         dc.l    WrTBHI
  315.         dc.l    WrTOD10THS
  316.         dc.l    WrTODSEC
  317.         dc.l    WrTODMIN
  318.         dc.l    WrTODHR
  319.         dc.l    WrNormal
  320.         dc.l    WrICR
  321.         dc.l    WrCRA
  322.         dc.l    WrCRB
  323.  
  324. WrBPRA        move.b    d1,PRA(a0)        ;Floppy/VA
  325.         tst.b    IECIsOpen        ;Wenn IEC aktiv ist, Port setzen
  326.         beq    WrBNewVA
  327.         move.b    d1,_ciaaprb
  328.         bra    WrBNewVA
  329.  
  330. WrBDDRA        move.b    d1,DDRA(a0)        ;Floppy/VA
  331.         tst.b    IECIsOpen        ;Wenn IEC aktiv ist, DDR setzen
  332.         beq    WrBNewVA
  333.         move.b    d1,_ciaaddrb
  334. WrBNewVA    move.b    DDRA(a0),d0        ;VA extrahieren
  335.         not.b    d0
  336.         or.b    PRA(a0),d0
  337.         not.b    d0
  338.         and.b    #$03,d0
  339.         bra    ChangedVA        ;Und dem VIC mitteilen
  340.  
  341.  
  342. **
  343. ** Aus einem CIA-A-Register lesen
  344. ** d0.w: Registernummer ($00-$0f)
  345. ** Rückgabe: d0.b: Byte
  346. **
  347. ** Darf das obere Wort von d0 und d1 nicht verändern!
  348. ** Darf a1 nicht verändern!
  349. **
  350.  
  351. ReadFrom6526A    move.l    ReadTabA(pc,d0.w*4),a0
  352.         jmp    (a0)
  353.  
  354.         CNOP    0,4
  355. ReadTabA    dc.l    RdAPRA
  356.         dc.l    RdAPRB
  357.         dc.l    RdANormal
  358.         dc.l    RdANormal
  359.         dc.l    RdATALO
  360.         dc.l    RdATAHI
  361.         dc.l    RdATBLO
  362.         dc.l    RdATBHI
  363.         dc.l    RdATOD10THS
  364.         dc.l    RdANormal
  365.         dc.l    RdANormal
  366.         dc.l    RdATODHR
  367.         dc.l    RdANormal
  368.         dc.l    RdAICR
  369.         dc.l    RdANormal
  370.         dc.l    RdANormal
  371.  
  372. RdANormal    lea    Registers1,a0
  373.         move.b    (a0,d0.w),d0
  374.         rts
  375.  
  376. RdAPRA        lea    Registers1,a0
  377.         move.b    DDRA(a0),d0
  378.         not.b    d0
  379.         or.b    PRA(a0),d0
  380.         and.b    JOY2(a0),d0
  381.         rts
  382.  
  383. RdAPRB        move.l    a1,-(sp)
  384.         lea    Registers1,a0
  385.         lea    KeyMatrix,a1
  386.         move.b    PRA(a0),d1    ;Tastaturabfrage
  387.         move.b    #$ff,d0        ;Alle aktiven Reihen dazuANDen
  388.         lsr.b    #1,d1
  389.         bcs    1$
  390.         and.b    (a1),d0
  391. 1$        lsr.b    #1,d1
  392.         bcs    2$
  393.         and.b    1(a1),d0
  394. 2$        lsr.b    #1,d1
  395.         bcs    3$
  396.         and.b    2(a1),d0
  397. 3$        lsr.b    #1,d1
  398.         bcs    4$
  399.         and.b    3(a1),d0
  400. 4$        lsr.b    #1,d1
  401.         bcs    5$
  402.         and.b    4(a1),d0
  403. 5$        lsr.b    #1,d1
  404.         bcs    6$
  405.         and.b    5(a1),d0
  406. 6$        lsr.b    #1,d1
  407.         bcs    7$
  408.         and.b    6(a1),d0
  409. 7$        lsr.b    #1,d1
  410.         bcs    8$
  411.         and.b    7(a1),d0
  412.  
  413. 8$        and.b    JOY1(a0),d0
  414.         move.b    DDRB(a0),d1
  415.         not.b    d1
  416.         or.b    PRB(a0),d1
  417.         and.b    d1,d0
  418.         move.l    (sp)+,a1
  419.         rts
  420.  
  421. RdATALO        move.b    Registers1+TALO,d0    ;Weil die Timer im Registerfile
  422.         rts                ;als big-endian gespeichert sind
  423.  
  424. RdATAHI        move.b    Registers1+TAHI,d0
  425.         rts
  426.  
  427. RdATBLO        move.b    Registers1+TBLO,d0
  428.         rts
  429.  
  430. RdATBHI        move.b    Registers1+TBHI,d0
  431.         rts
  432.  
  433. RdATOD10THS    lea    Registers1,a0
  434.         move.b    TOD10THS(a0),d0
  435.         clr.b    TODHALT(a0)    ;TOD weiterlaufen lassen
  436.         rts
  437.  
  438. RdATODHR    lea    Registers1,a0
  439.         st.b    TODHALT(a0)    ;TOD anhalten
  440.         move.b    TODHR(a0),d0
  441.         rts
  442.  
  443. RdAICR        lea    Registers1,a0
  444.         move.b    ICR(a0),d0    ;ICR beim Lesen löschen
  445.         clr.b    ICR(a0)
  446.         clr.b    IntIsCIAIRQ    ;IRQ zurücknehmen
  447.         rts
  448.  
  449.  
  450. **
  451. ** Aus einem CIA-B-Register lesen
  452. ** d0.w: Registernummer ($00-$0f)
  453. ** Rückgabe: d0.b: Byte
  454. **
  455. ** Darf das obere Wort von d0 und d1 nicht verändern!
  456. ** Darf a1 nicht verändern!
  457. **
  458.  
  459. ReadFrom6526B    move.l    ReadTabB(pc,d0.w*4),a0
  460.         jmp    (a0)
  461.  
  462.         CNOP    0,4
  463. ReadTabB    dc.l    RdBPRA
  464.         dc.l    RdBPRB
  465.         dc.l    RdBNormal
  466.         dc.l    RdBNormal
  467.         dc.l    RdBTALO
  468.         dc.l    RdBTAHI
  469.         dc.l    RdBTBLO
  470.         dc.l    RdBTBHI
  471.         dc.l    RdBTOD10THS
  472.         dc.l    RdBNormal
  473.         dc.l    RdBNormal
  474.         dc.l    RdBTODHR
  475.         dc.l    RdBNormal
  476.         dc.l    RdBICR
  477.         dc.l    RdBNormal
  478.         dc.l    RdBNormal
  479.  
  480. RdBNormal    lea    Registers2,a0
  481.         move.b    (a0,d0.w),d0
  482.         rts
  483.  
  484. RdBPRA        lea    Registers2,a0
  485.         move.b    DDRA(a0),d0    ;Floppy/VA
  486.         not.b    d0
  487.         or.b    PRA(a0),d0
  488.  
  489.         tst.b    IECIsOpen    ;Wenn IEC aktiv ist, davon lesen
  490.         beq    1$
  491.         and.b    #$03,d0
  492.         move.b    _ciaaprb,d1
  493.         and.b    #$fc,d1
  494.         or.b    d1,d0
  495. 1$        rts
  496.  
  497. RdBPRB        lea    Registers2,a0
  498.         move.b    DDRB(a0),d0    ;Userport
  499.         not.b    d0        ;Eingabebits immer 1
  500.         or.b    PRB(a0),d0
  501.         rts
  502.  
  503. RdBTALO        move.b    Registers2+TALO,d0    ;Weil die Timer im Registerfile
  504.         rts                ;als big-endian gespeichert sind
  505.  
  506. RdBTAHI        move.b    Registers2+TAHI,d0
  507.         rts
  508.  
  509. RdBTBLO        move.b    Registers2+TBLO,d0
  510.         rts
  511.  
  512. RdBTBHI        move.b    Registers2+TBHI,d0
  513.         rts
  514.  
  515. RdBTOD10THS    lea    Registers2,a0
  516.         move.b    TOD10THS(a0),d0
  517.         clr.b    TODHALT(a0)    ;TOD weiterlaufen lassen
  518.         rts
  519.  
  520. RdBTODHR    lea    Registers2,a0
  521.         st.b    TODHALT(a0)    ;TOD anhalten
  522.         move.b    TODHR(a0),d0
  523.         rts
  524.  
  525. RdBICR        lea    Registers2,a0
  526.         move.b    ICR(a0),d0    ;ICR beim Lesen löschen
  527.         clr.b    ICR(a0)
  528.         rts
  529.  
  530.  
  531. **
  532. ** Wird jede Rasterzeile einmal aufgerufen
  533. **
  534.  
  535. *
  536. * CIA-A
  537. * d1: ICR
  538. * d2: INTMASK
  539. * d3: CIACycles
  540. *
  541.  
  542. Periodic6526    lea    Registers1,a0
  543.         move.b    ICR(a0),d1
  544.         move.b    INTMASK(a0),d2
  545.         move.w    CIACycles,d3
  546.  
  547. *
  548. * Timer A
  549. *
  550.  
  551.         tst.b    TACNTPHI2(a0)    ;Wird Phi2 gezählt?
  552.         beq    CiaATADone
  553.  
  554.         sub.w    d3,TAHI(a0)    ;Ja, herabzählen
  555.         bcc    CiaATADone    ;Unterlauf?
  556.  
  557.         or.b    #$01,d1        ;Ja, IRQ-Bit setzen
  558.         btst    #0,d2        ;IRQ freigegeben?
  559.         beq    CiaATANoIRQ
  560.         or.b    #$80,d1        ;Ja, IR-Bit setzen
  561.         st.b    IntIsCIAIRQ    ;und IRQ auslösen
  562.  
  563. CiaATANoIRQ    move.w    LTCHA(a0),TAHI(a0) ;Zähler neu laden
  564.         btst    #3,CRA(a0)    ;One-Shot?
  565.         beq    1$
  566.         and.b    #$fe,CRA(a0)    ;Ja, Zähler stoppen
  567.         clr.b    TACNTPHI2(a0)
  568.  
  569. 1$        tst.b    TBCNTTA(a0)    ;Läuft Timer B und zählt er
  570.         beq    CiaATADone    ; Unterläufe von Timer A?
  571.  
  572.         subq.w    #1,TBHI(a0)    ;Ja, Timer B runterzählen
  573.         bcs    CiaATBUnderflow    ;Untergelaufen?
  574. CiaATADone
  575.  
  576. *
  577. * Timer B
  578. *
  579.  
  580.         tst.b    TBCNTPHI2(a0)    ;Wird Phi2 gezählt?
  581.         beq    CiaATBDone
  582.  
  583.         sub.w    d3,TBHI(a0)    ;Ja, herabzählen
  584.         bcc    CiaATBDone    ;Unterlauf?
  585.  
  586. CiaATBUnderflow    or.b    #$02,d1        ;Ja, IRQ-Bit setzen
  587.         btst    #1,d2        ;IRQ freigegeben?
  588.         beq    CiaATBNoIRQ
  589.         or.b    #$80,d1        ;Ja, IR-Bit setzen
  590.         st.b    IntIsCIAIRQ    ;und IRQ auslösen
  591.  
  592. CiaATBNoIRQ    move.w    LTCHB(a0),TBHI(a0) ;Zähler neu laden
  593.         btst    #3,CRB(a0)    ;One-Shot?
  594.         beq    CiaATBDone
  595.         and.b    #$fe,CRB(a0)    ;Ja, Zähler stoppen
  596.         clr.b    TBCNTPHI2(a0)
  597.         clr.b    TBCNTTA(a0)
  598. CiaATBDone
  599.  
  600. *
  601. * ICR zurückschreiben
  602. *
  603.  
  604.         move.b    d1,ICR(a0)
  605.  
  606. *
  607. * CIA-B
  608. * d1: ICR
  609. * d2: INTMASK
  610. * d3: CIACycles
  611. *
  612.  
  613.         lea    Registers2,a0
  614.         move.b    ICR(a0),d1
  615.         move.b    INTMASK(a0),d2
  616.  
  617. *
  618. * Timer A
  619. *
  620.  
  621.         tst.b    TACNTPHI2(a0)    ;Wird Phi2 gezählt?
  622.         beq    CiaBTADone
  623.  
  624.         sub.w    d3,TAHI(a0)    ;Ja, herabzählen
  625.         bcc    CiaBTADone    ;Unterlauf?
  626.  
  627.         or.b    #$01,d1        ;Ja, IRQ-Bit setzen
  628.         btst    #0,d2        ;IRQ freigegeben?
  629.         beq    CiaBTANoIRQ
  630.         or.b    #$80,d1        ;Ja, IR-Bit setzen
  631.         st.b    IntIsNMI    ;und NMI auslösen
  632.  
  633. CiaBTANoIRQ    move.w    LTCHA(a0),TAHI(a0) ;Zähler neu laden
  634.         btst    #3,CRA(a0)    ;One-Shot?
  635.         beq    1$
  636.         and.b    #$fe,CRA(a0)    ;Ja, Zähler stoppen
  637.         clr.b    TACNTPHI2(a0)
  638.  
  639. 1$        tst.b    TBCNTTA(a0)    ;Läuft Timer B und zählt er
  640.         beq    CiaBTADone    ; Unterläufe von Timer A?
  641.  
  642.         subq.w    #1,TBHI(a0)    ;Ja, Timer B runterzählen
  643.         bcs    CiaBTBUnderflow    ;Untergelaufen?
  644. CiaBTADone
  645.  
  646. *
  647. * Timer B
  648. *
  649.  
  650.         tst.b    TBCNTPHI2(a0)    ;Wird Phi2 gezählt?
  651.         beq    CiaBTBDone
  652.  
  653.         sub.w    d3,TBHI(a0)    ;Ja, herabzählen
  654.         bcc    CiaBTBDone    ;Unterlauf?
  655.  
  656. CiaBTBUnderflow    or.b    #$02,d1        ;Ja, IRQ-Bit setzen
  657.         btst    #1,d2        ;IRQ freigegeben?
  658.         beq    CiaBTBNoIRQ
  659.         or.b    #$80,d1        ;Ja, IR-Bit setzen
  660.         st.b    IntIsNMI    ;und NMI auslösen
  661.  
  662. CiaBTBNoIRQ    move.w    LTCHB(a0),TBHI(a0) ;Zähler neu laden
  663.         btst    #3,CRB(a0)    ;One-Shot?
  664.         beq    CiaBTBDone
  665.         and.b    #$fe,CRB(a0)    ;Ja, Zähler stoppen
  666.         clr.b    TBCNTPHI2(a0)
  667.         clr.b    TBCNTTA(a0)
  668. CiaBTBDone
  669.  
  670. *
  671. * ICR zurückschreiben
  672. *
  673.  
  674.         move.b    d1,ICR(a0)
  675.  
  676. *
  677. * Joystickabfrage
  678. *
  679.  
  680.         lea    Registers1,a0
  681.  
  682. ; Port 1
  683.         move.b    #$ff,d2        ;Vorgabe: Joystick inaktiv
  684.         tst.w    Joystick1On(pc)
  685.         beq    15$
  686.  
  687.         btst    #6,$bfe001    ;Feuerknopf
  688.         bne    11$
  689.         bclr    #4,d2
  690.  
  691. 11$        move.w    $dff00a,d0
  692.         btst    #1,d0        ;Rechts
  693.         beq    12$
  694.         bclr    #3,d2
  695.  
  696. 12$        btst    #9,d0        ;Links
  697.         beq    13$
  698.         bclr    #2,d2
  699.  
  700. 13$        move.w    d0,d1
  701.         add.w    d0,d0
  702.         eor.w    d1,d0
  703.         btst    #1,d0        ;Runter
  704.         beq    14$
  705.         bclr    #1,d2
  706.  
  707. 14$        btst    #9,d0        ;Hoch
  708.         beq    15$
  709.         bclr    #0,d2
  710.  
  711. 15$        move.b    d2,JOY1(a0)
  712.  
  713. ; Port 2
  714.         move.b    #$ff,d2        ;Vorgabe: Joystick inaktiv
  715.         tst.w    Joystick2On(pc)
  716.         beq    25$
  717.  
  718.         btst    #7,$bfe001    ;Feuerknopf
  719.         bne    21$
  720.         bclr    #4,d2
  721.  
  722. 21$        move.w    $dff00c,d0
  723.         btst    #1,d0        ;Rechts
  724.         beq    22$
  725.         bclr    #3,d2
  726.  
  727. 22$        btst    #9,d0        ;Links
  728.         beq    23$
  729.         bclr    #2,d2
  730.  
  731. 23$        move.w    d0,d1
  732.         add.w    d0,d0
  733.         eor.w    d1,d0
  734.         btst    #1,d0        ;Runter
  735.         beq    24$
  736.         bclr    #1,d2
  737.  
  738. 24$        btst    #9,d0        ;Hoch
  739.         beq    25$
  740.         bclr    #0,d2
  741.  
  742. 25$        move.b    d2,JOY2(a0)
  743.  
  744. ; Joysticks vertauschen?
  745.         tst.w    JoystickSwap(pc)
  746.         beq    30$
  747.         move.b    JOY1(a0),d0
  748.         move.b    JOY2(a0),JOY1(a0)
  749.         move.b    d0,JOY2(a0)
  750.  
  751. ; In 6510-Task zurückspringen
  752. 30$        bra    Peri6526Cont
  753.  
  754.  
  755. **
  756. ** TODs zählen
  757. **
  758.  
  759. *
  760. * CIA-A
  761. *
  762.  
  763. CountTODs    lea    Registers1,a0
  764.         subq.b    #1,TODDIV(a0)    ;Frequenzteiler herabzählen
  765.         bpl    CiaATODNop
  766.  
  767.         btst    #7,CRA(a0)    ;Untergelaufen,
  768.         beq    CiaATOD60Hz    ; je nach 50/60Hz-Flag neu laden
  769.         move.b    #4,TODDIV(a0)
  770.         bra    CiaATODLoaded
  771. CiaATOD60Hz    move.b    #5,TODDIV(a0)
  772.  
  773. CiaATODLoaded    move    #0,ccr        ;X löschen
  774.         move.b    #1,d0        ;1/10 Sekunden erhöhen
  775.         move.b    TOD10THS(a0),d1
  776.         abcd    d0,d1
  777.         move.b    d1,TOD10THS(a0)
  778.         cmp.b    #$10,d1        ;Über 10?
  779.         blo    CiaATODDone
  780.  
  781.         clr.b    TOD10THS(a0)    ;Ja, 1/10 Sekunden auf Null setzen
  782.         move    #0,ccr        ;und Sekunden erhöhen
  783.         move.b    #1,d0
  784.         move.b    TODSEC(a0),d1
  785.         abcd    d0,d1
  786.         move.b    d1,TODSEC(a0)
  787.         cmp.b    #$60,d1        ;Über 60?
  788.         blo    CiaATODDone
  789.  
  790.         clr.b    TODSEC(a0)    ;Ja, Sekunden auf Null setzen
  791.         move    #0,ccr        ;und Minuten erhöhen
  792.         move.b    #1,d0
  793.         move.b    TODMIN(a0),d1
  794.         abcd    d0,d1
  795.         move.b    d1,TODMIN(a0)
  796.         cmp.b    #$60,d1        ;Über 60?
  797.         blo    CiaATODDone
  798.  
  799.         clr.b    TODMIN(a0)    ;Ja, Minuten auf Null setzen
  800.         move    #0,ccr        ;und Stunden erhöhen
  801.         move.b    #1,d0
  802.         move.b    TODHR(a0),d1
  803.         and.b    #$1f,d1        ;AM/PM ausmaskieren
  804.         abcd    d0,d1
  805.         and.b    #$80,TODHR(a0)    ;Stunden schreiben, AM/PM lassen
  806.         or.b    d1,TODHR(a0)
  807.  
  808.         cmp.b    #$12,d1        ;Über 12?
  809.         blo    CiaATODDone
  810.  
  811.         and.b    #$1f,TODHR(a0)    ;Ja, Stunden auf Null setzen
  812.         eor.b    #$80,TODHR(a0)    ;und AM/PM umdrehen
  813.  
  814. CiaATODDone    move.l    TOD10THS(a0),d0    ;Alarmzeit erreicht?
  815.         cmp.l    ALM10THS(a0),d0
  816.         bne    CiaATODNop
  817.         move.b    ICR(a0),d0    ;Ja, IRQ-Bit setzen
  818.         or.b    #$04,d0
  819.         btst    #2,INTMASK(a0)    ;IRQ freigegeben?
  820.         beq    CiaATODNoIRQ
  821.         or.b    #$80,d0        ;Ja, IR-Bit setzen
  822.         st.b    IntIsCIAIRQ    ;und IRQ auslösen
  823. CiaATODNoIRQ    move.b    d0,ICR(a0)
  824. CiaATODNop
  825.  
  826. *
  827. * CIA-B
  828. *
  829.  
  830.         lea    Registers2,a0
  831.         subq.b    #1,TODDIV(a0)    ;Frequenzteiler herabzählen
  832.         bpl    CiaBTODNop
  833.  
  834.         btst    #7,CRA(a0)    ;Untergelaufen,
  835.         beq    CiaBTOD60Hz    ; je nach 50/60Hz-Flag neu laden
  836.         move.b    #4,TODDIV(a0)
  837.         bra    CiaBTODLoaded
  838. CiaBTOD60Hz    move.b    #5,TODDIV(a0)
  839.  
  840. CiaBTODLoaded    move    #0,ccr        ;X löschen
  841.         move.b    #1,d0        ;1/10 Sekunden erhöhen
  842.         move.b    TOD10THS(a0),d1
  843.         abcd    d0,d1
  844.         move.b    d1,TOD10THS(a0)
  845.         cmp.b    #$10,d1        ;Über 10?
  846.         blo    CiaBTODDone
  847.  
  848.         clr.b    TOD10THS(a0)    ;Ja, 1/10 Sekunden auf Null setzen
  849.         move    #0,ccr        ;und Sekunden erhöhen
  850.         move.b    #1,d0
  851.         move.b    TODSEC(a0),d1
  852.         abcd    d0,d1
  853.         move.b    d1,TODSEC(a0)
  854.         cmp.b    #$60,d1        ;Über 60?
  855.         blo    CiaBTODDone
  856.  
  857.         clr.b    TODSEC(a0)    ;Ja, Sekunden auf Null setzen
  858.         move    #0,ccr        ;und Minuten erhöhen
  859.         move.b    #1,d0
  860.         move.b    TODMIN(a0),d1
  861.         abcd    d0,d1
  862.         move.b    d1,TODMIN(a0)
  863.         cmp.b    #$60,d1        ;Über 60?
  864.         blo    CiaBTODDone
  865.  
  866.         clr.b    TODMIN(a0)    ;Ja, Minuten auf Null setzen
  867.         move    #0,ccr        ;und Stunden erhöhen
  868.         move.b    #1,d0
  869.         move.b    TODHR(a0),d1
  870.         and.b    #$1f,d1        ;AM/PM ausmaskieren
  871.         abcd    d0,d1
  872.         and.b    #$80,TODHR(a0)    ;Stunden schreiben, AM/PM lassen
  873.         or.b    d1,TODHR(a0)
  874.  
  875.         cmp.b    #$12,d1        ;Über 12?
  876.         blo    CiaBTODDone
  877.  
  878.         and.b    #$1f,TODHR(a0)    ;Ja, Stunden auf Null setzen
  879.         eor.b    #$80,TODHR(a0)    ;und AM/PM umdrehen
  880.  
  881. CiaBTODDone    move.l    TOD10THS(a0),d0    ;Alarmzeit erreicht?
  882.         cmp.l    ALM10THS(a0),d0
  883.         bne    CiaBTODNop
  884.         move.b    ICR(a0),d0    ;Ja, IRQ-Bit setzen
  885.         or.b    #$04,d0
  886.         btst    #2,INTMASK(a0)    ;IRQ freigegeben?
  887.         beq    CiaBTODNoIRQ
  888.         or.b    #$80,d0        ;Ja, IR-Bit setzen
  889.         st.b    IntIsNMI    ;und NMI auslösen
  890. CiaBTODNoIRQ    move.b    d0,ICR(a0)
  891. CiaBTODNop    rts
  892.  
  893.  
  894. **
  895. ** Taste wurde gedrückt
  896. ** d0.b: RawKey-Code
  897. **
  898.  
  899. KeyPressed    lea    KeyMatrix,a0
  900.  
  901.         bclr    #7,d0        ;KeyUp/KeyDown
  902.         bne    1$
  903.  
  904.         cmp.b    #$40,d0
  905.         bhs    KeyDownSpecial
  906.         and.w    #$003f,d0
  907.         movem.w    KeyTable(pc,d0.w*4),d0/d1
  908.         bclr    d1,(a0,d0.w)
  909.         rts
  910.  
  911. 1$        cmp.b    #$40,d0
  912.         bhs    KeyUpSpecial
  913.         and.w    #$003f,d0
  914.         movem.w    KeyTable(pc,d0.w*4),d0/d1
  915.         bset    d1,(a0,d0.w)
  916.         rts
  917.  
  918. ; Die häßlichste Tastaturabfrage aller Zeiten...
  919. KeyDownSpecial    cmp.b    #$5f,d0        ;Help -> Restore
  920.         beq    KeyHelpD
  921.         cmp.b    #$59,d0        ;F10 -> Reset
  922.         beq    KeyF10D
  923.         cmp.b    #$58,d0        ;F9 -> Prefs
  924.         beq    KeyF9D
  925.         cmp.b    #$40,d0        ;Space
  926.         beq    KeySpaceD
  927.         cmp.b    #$41,d0        ;Backspace -> DEL
  928.         beq    KeyBackD
  929.         cmp.b    #$44,d0        ;Return
  930.         beq    KeyReturnD
  931.         cmp.b    #$45,d0        ;Esc -> R/S
  932.         beq    KeyEscD
  933.         cmp.b    #$46,d0        ;Delete -> HOME
  934.         beq    KeyDeleteD
  935.         cmp.b    #$4c,d0        ;Crsr up -> Shift CUD
  936.         beq    KeyUpD
  937.         cmp.b    #$4d,d0        ;Crsr down -> CUD
  938.         beq    KeyDownD
  939.         cmp.b    #$4e,d0        ;Crsr right -> CLR
  940.         beq    KeyRightD
  941.         cmp.b    #$4f,d0        ;Crsr left -> Shift CLR
  942.         beq    KeyLeftD
  943.         cmp.b    #$50,d0        ;F1
  944.         beq    KeyF1D
  945.         cmp.b    #$51,d0        ;F2
  946.         beq    KeyF2D
  947.         cmp.b    #$52,d0        ;F3
  948.         beq    KeyF3D
  949.         cmp.b    #$53,d0        ;F4
  950.         beq    KeyF4D
  951.         cmp.b    #$54,d0        ;F5
  952.         beq    KeyF5D
  953.         cmp.b    #$55,d0        ;F6
  954.         beq    KeyF6D
  955.         cmp.b    #$56,d0        ;F7
  956.         beq    KeyF7D
  957.         cmp.b    #$57,d0        ;F8
  958.         beq    KeyF8D
  959.         cmp.b    #$60,d0        ;Shift links
  960.         beq    KeyShiftLD
  961.         cmp.b    #$61,d0        ;Shift rechts
  962.         beq    KeyShiftRD
  963.         cmp.b    #$62,d0        ;Caps -> SHL
  964.         beq    KeyShiftLD
  965.         cmp.b    #$63,d0        ;Ctrl
  966.         beq    KeyCtrlD
  967.         cmp.b    #$66,d0        ;Amiga links -> C=
  968.         beq    KeyAmigaD
  969.         cmp.b    #$67,d0        ;Amiga rechts -> C=
  970.         beq    KeyAmigaD
  971.         rts
  972.  
  973. KeyUpSpecial    cmp.b    #$40,d0        ;Space
  974.         beq    KeySpaceU
  975.         cmp.b    #$41,d0        ;Backspace -> DEL
  976.         beq    KeyBackU
  977.         cmp.b    #$44,d0        ;Return
  978.         beq    KeyReturnU
  979.         cmp.b    #$45,d0        ;Esc -> R/S
  980.         beq    KeyEscU
  981.         cmp.b    #$46,d0        ;Delete -> HOME
  982.         beq    KeyDeleteU
  983.         cmp.b    #$4c,d0        ;Crsr up -> Shift CUD
  984.         beq    KeyUpU
  985.         cmp.b    #$4d,d0        ;Crsr down -> CUD
  986.         beq    KeyDownU
  987.         cmp.b    #$4e,d0        ;Crsr right -> CLR
  988.         beq    KeyRightU
  989.         cmp.b    #$4f,d0        ;Crsr up -> Shift CUD
  990.         beq    KeyLeftU
  991.         cmp.b    #$50,d0        ;F1
  992.         beq    KeyF1U
  993.         cmp.b    #$51,d0        ;F2
  994.         beq    KeyF2U
  995.         cmp.b    #$52,d0        ;F3
  996.         beq    KeyF3U
  997.         cmp.b    #$53,d0        ;F4
  998.         beq    KeyF4U
  999.         cmp.b    #$54,d0        ;F5
  1000.         beq    KeyF5U
  1001.         cmp.b    #$55,d0        ;F6
  1002.         beq    KeyF6U
  1003.         cmp.b    #$56,d0        ;F7
  1004.         beq    KeyF7U
  1005.         cmp.b    #$57,d0        ;F8
  1006.         beq    KeyF8U
  1007.         cmp.b    #$60,d0        ;Shift links
  1008.         beq    KeyShiftLU
  1009.         cmp.b    #$61,d0        ;Shift rechts
  1010.         beq    KeyShiftRU
  1011.         cmp.b    #$62,d0        ;Caps -> SHL
  1012.         beq    KeyShiftLU
  1013.         cmp.b    #$63,d0        ;Ctrl
  1014.         beq    KeyCtrlU
  1015.         cmp.b    #$66,d0        ;Amiga links -> C=
  1016.         beq    KeyAmigaU
  1017.         cmp.b    #$67,d0        ;Amiga rechts -> C=
  1018.         beq    KeyAmigaU
  1019.         rts
  1020.  
  1021. KeyHelpD    st.b    IntIsNMI    ;NMI auslösen
  1022.         rts
  1023.  
  1024. KeyF10D        st.b    IntIsRESET    ;6510-Reset
  1025.         bsr    Reset6526
  1026.         bra    Reset6581
  1027.  
  1028. KeyF9D        jmp    ShowPrefs
  1029.  
  1030. ; Es folgt ein Alptraum. Bitte die Augen schließen.
  1031. KeySpaceD    bclr    #4,7(a0)
  1032.         rts
  1033. KeySpaceU    bset    #4,7(a0)
  1034.         rts
  1035. KeyBackD    bclr    #0,(a0)
  1036.         rts
  1037. KeyBackU    bset    #0,(a0)
  1038.         rts
  1039. KeyReturnD    bclr    #1,(a0)
  1040.         rts
  1041. KeyReturnU    bset    #1,(a0)
  1042.         rts
  1043. KeyEscD        bclr    #7,7(a0)
  1044.         rts
  1045. KeyEscU        bset    #7,7(a0)
  1046.         rts
  1047. KeyDeleteD    bclr    #3,6(a0)
  1048.         rts
  1049. KeyDeleteU    bset    #3,6(a0)
  1050.         rts
  1051. KeyUpD        bclr    #4,6(a0)
  1052.         bclr    #7,(a0)
  1053.         rts
  1054. KeyUpU        bset    #4,6(a0)
  1055.         bset    #7,(a0)
  1056.         rts
  1057. KeyDownD    bclr    #7,(a0)
  1058.         rts
  1059. KeyDownU    bset    #7,(a0)
  1060.         rts
  1061. KeyRightD    bclr    #2,(a0)
  1062.         rts
  1063. KeyRightU    bset    #2,(a0)
  1064.         rts
  1065. KeyLeftD    bclr    #4,6(a0)
  1066.         bclr    #2,(a0)
  1067.         rts
  1068. KeyLeftU    bset    #4,6(a0)
  1069.         bset    #2,(a0)
  1070.         rts
  1071. KeyF1D        bclr    #4,(a0)
  1072.         rts
  1073. KeyF1U        bset    #4,(a0)
  1074.         rts
  1075. KeyF3D        bclr    #5,(a0)
  1076.         rts
  1077. KeyF3U        bset    #5,(a0)
  1078.         rts
  1079. KeyF5D        bclr    #6,(a0)
  1080.         rts
  1081. KeyF5U        bset    #6,(a0)
  1082.         rts
  1083. KeyF7D        bclr    #3,(a0)
  1084.         rts
  1085. KeyF7U        bset    #3,(a0)
  1086.         rts
  1087. KeyF2D        bclr    #4,6(a0)
  1088.         bclr    #4,(a0)
  1089.         rts
  1090. KeyF2U        bset    #4,6(a0)
  1091.         bset    #4,(a0)
  1092.         rts
  1093. KeyF4D        bclr    #4,6(a0)
  1094.         bclr    #5,(a0)
  1095.         rts
  1096. KeyF4U        bset    #4,6(a0)
  1097.         bset    #5,(a0)
  1098.         rts
  1099. KeyF6D        bclr    #4,6(a0)
  1100.         bclr    #6,(a0)
  1101.         rts
  1102. KeyF6U        bset    #4,6(a0)
  1103.         bset    #6,(a0)
  1104.         rts
  1105. KeyF8D        bclr    #4,6(a0)
  1106.         bclr    #3,(a0)
  1107.         rts
  1108. KeyF8U        bset    #4,6(a0)
  1109.         bset    #3,(a0)
  1110.         rts
  1111. KeyShiftLD    bclr    #7,1(a0)
  1112.         rts
  1113. KeyShiftLU    bset    #7,1(a0)
  1114.         rts
  1115. KeyShiftRD    bclr    #4,6(a0)
  1116.         rts
  1117. KeyShiftRU    bset    #4,6(a0)
  1118.         rts
  1119. KeyCtrlD    bclr    #2,7(a0)
  1120.         rts
  1121. KeyCtrlU    bset    #2,7(a0)
  1122.         rts
  1123. KeyAmigaD    bclr    #5,7(a0)
  1124.         rts
  1125. KeyAmigaU    bset    #5,7(a0)
  1126.         rts
  1127.  
  1128.  
  1129. **
  1130. ** Datenbereich
  1131. **
  1132.  
  1133.         CNOP    0,4
  1134. Registers1    ds.b    32    ;CIA-A-Register
  1135. Registers2    ds.b    32    ;CIA-B-Register
  1136.  
  1137. CIACycles    dc.w    0    ;Anzahl Phi2-Zyklen pro Rasterzeile (für Timer)
  1138. Joystick1On    dc.w    0    ;Joystick an Port 1 wird abgefragt
  1139. Joystick2On    dc.w    0    ;Joystick an Port 2 wird abgefragt
  1140. JoystickSwap    dc.w    0    ;Joysticks vertauschen
  1141. KeyboardYZ    dc.w    0    ;Amerikanische Tastaturbelegung
  1142.  
  1143. ; Tastaturübersetzungstabelle:
  1144. ; Für jeden Amiga-RawKey Spalte und Zeile in der KeyMatrix
  1145.         CNOP    0,4
  1146. KeyTable    dc.w    7,1    ;` -> <-
  1147.         dc.w    7,0    ;1
  1148.         dc.w    7,3    ;2
  1149.         dc.w    1,0    ;3
  1150.         dc.w    1,3    ;4
  1151.         dc.w    2,0    ;5
  1152.         dc.w    2,3    ;6
  1153.         dc.w    3,0    ;7
  1154.         dc.w    3,3    ;8
  1155.         dc.w    4,0    ;9
  1156.         dc.w    4,3    ;0
  1157.         dc.w    5,0    ;ß -> +
  1158.         dc.w    5,3    ;´ -> -
  1159.         dc.w    6,0    ;\ -> £
  1160.         dc.w    0,0
  1161.         dc.w    4,3    ;NP 0
  1162.  
  1163.         dc.w    7,6    ;Q
  1164.         dc.w    1,1    ;W
  1165.         dc.w    1,6    ;E
  1166.         dc.w    2,1    ;R
  1167.         dc.w    2,6    ;T
  1168. KeyPatch1    dc.w    1,4    ;Y -> Z
  1169.         dc.w    3,6    ;U
  1170.         dc.w    4,1    ;I
  1171.         dc.w    4,6    ;O
  1172.         dc.w    5,1    ;P
  1173.         dc.w    5,6    ;ü -> @
  1174.         dc.w    6,1    ;+ -> *
  1175.         dc.w    0,0
  1176.         dc.w    7,0    ;NP 1
  1177.         dc.w    7,3    ;NP 2
  1178.         dc.w    1,0    ;NP 3
  1179.  
  1180.         dc.w    1,2    ;A
  1181.         dc.w    1,5    ;S
  1182.         dc.w    2,2    ;D
  1183.         dc.w    2,5    ;F
  1184.         dc.w    3,2    ;G
  1185.         dc.w    3,5    ;H
  1186.         dc.w    4,2    ;J
  1187.         dc.w    4,5    ;K
  1188.         dc.w    5,2    ;L
  1189.         dc.w    5,5    ;ö -> :
  1190.         dc.w    6,2    ;ä -> ;
  1191.         dc.w    6,5    ;# -> =
  1192.         dc.w    0,0
  1193.         dc.w    1,3    ;NP 4
  1194.         dc.w    2,0    ;NP 5
  1195.         dc.w    2,3    ;NP 6
  1196.  
  1197.         dc.w    6,6    ;< -> ^
  1198. KeyPatch2    dc.w    3,1    ;Z -> Y
  1199.         dc.w    2,7    ;X
  1200.         dc.w    2,4    ;C
  1201.         dc.w    3,7    ;V
  1202.         dc.w    3,4    ;B
  1203.         dc.w    4,7    ;N
  1204.         dc.w    4,4    ;M
  1205.         dc.w    5,7    ;,
  1206.         dc.w    5,4    ;.
  1207.         dc.w    6,7    ;- -> /
  1208.         dc.w    0,0
  1209.         dc.w    0,0
  1210.         dc.w    3,0    ;NP 7
  1211.         dc.w    3,3    ;NP 8
  1212.         dc.w    4,0    ;NP 9
  1213.  
  1214. ; Bit  7   6   5   4   3   2   1   0
  1215. ; 0   CUD  F5  F3  F1  F7 CLR RET DEL
  1216. ; 1   SHL  E   S   Z   4   A   W   3
  1217. ; 2    X   T   F   C   6   D   R   5
  1218. ; 3    V   U   H   B   8   G   Y   7
  1219. ; 4    N   O   K   M   0   J   I   9
  1220. ; 5    ,   @   :   .   -   L   P   +
  1221. ; 6    /   ^   =  SHR HOM  ;   *   £
  1222. ; 7   R/S  Q   C= SPC  2  CTL  <-  1
  1223.  
  1224. KeyMatrix    ds.b    8    ;C64-Tastaturmatrix pro Taste ein Bit
  1225.                 ;0: Taste gedrückt
  1226.  
  1227.         END
  1228.